<?php

//import enums
require_once ("../enums/enums.php");

//import DO
require_once ("../persistance/data/ResponsableDO.php");
require_once ("../persistance/data/GestionnaireDO.php");
require_once ("../persistance/data/CommandeFactureDO.php");
require_once ("../persistance/data/LieuDO.php");
require_once ("../persistance/data/DetailDO.php");
require_once ("../persistance/data/TypeArticleDO.php");
require_once ("../persistance/data/ArticleDO.php");

//import DAO
require_once ("../persistance/dao/ResponsableDAO.php");
require_once ("../persistance/dao/GestionnaireDAO.php");
require_once ("../persistance/dao/CommandeFactureDAO.php");
require_once ("../persistance/dao/LieuDAO.php");
require_once ("../persistance/dao/DetailDAO.php");
require_once ("../persistance/dao/TypeArticleDAO.php");
require_once ("../persistance/dao/ArticleDAO.php");

//import Bean data
require_once ("../bean/data/Commande.php");
require_once ("../bean/data/Utilisateur.php");
require_once ("../bean/data/Lieu.php");
require_once ("../bean/data/Facture.php");
require_once ("../bean/data/Article.php");

/**
 *	Service disponnible pour l'authentification
 *
 * @author Quentin Laujac, Charles Hurtevent
 *
 */
class AuthentificationService{
	private $gestionnaireDAO;
	private $responsableDAO;
	private $lieuDAO;

	public function __construct(){
		$this->responsableDAO = new ResponsableDAO();
		$this->gestionnaireDAO = new GestionnaireDAO();
		$this->lieuDAO = new LieuDAO();
	}

	/**
	 * authenfifie l'utilisateur
	 *
	 * @throws Exception si l'utilisateur n'est pas inscrit ou si le mot de passe n'est pas bon
	 *
	 * @param String login
	 * @param String password
	 */
	public function authentification($login, $password){
		$responsableDO = new ResponsableDO();
		$gestionnaireDO = new GestionnaireDO();
		$responsableDO = $this->responsableDAO->getResponsableDO($login);
		$gestionnaireDO = $this->gestionnaireDAO->getGestionnaireDO($login);
			
		if($gestionnaireDO != null){
			if($gestionnaireDO->getPassword() != $password){
				return MAUVAIS_PASSWORD;
			}
			return ADMINISTRATEUR_AUTHENTIFIE;
		}

		if($responsableDO != null){
			if($responsableDO->getPassword() != $password){
				return MAUVAIS_PASSWORD;
			}
			return CLIENT_AUTHENTIFIE;
		}

		return MAUVAIS_LOGIN;
	}

	/**
	 *
	 * Retourne le client correspondant au login
	 * @param String $login
	 */
	public function getClient($login){
		$responsableDO = new ResponsableDO();
		$responsableDO = $this->responsableDAO->getResponsableDO($login);
		if($responsableDO == null){
			return null;
		}

		$utilisateur = $this->convertResponsableDOtoUtilisateur($responsableDO);
		return $utilisateur;
	}


	/**
	 *
	 * Retourne un Client en fonction de son numero de responsable
	 */
	public function getClientByNumResponsable($numResponsable){
		$responsableDO = new ResponsableDO();
		$responsableDO = $this->responsableDAO->getResponsableDOByNumResponsable($numResponsable);
		if($responsableDO == null){
			return null;
		}

		$utilisateur = $this->convertResponsableDOtoUtilisateur($responsableDO);
		return $utilisateur;
	}

	/**
	 *
	 * Retourne l'administrateur correspondant au login
	 * @param String $login
	 */
	public function getAdministrateur($login){
		$gestionnaireDO = $this->gestionnaireDAO->getGestionnaireDO($login);
		if($gestionnaireDO == null){
			return null;
		}

		$utilisateur = $this->convertGestionnaireDOtoUtilisateur($gestionnaireDO);
		return $utilisateur;
	}


	private function getListLieu(ResponsableDO $responsableDO){
		$listLieu = new ArrayObject();
		$listLieuDO = $this->lieuDAO->getListLieuDOByNumStructure($responsableDO->getNumeroStructure());

		foreach ( $listLieuDO as $lieuDO ) {
			$listLieu->append ( $this->convertLieuDOtoLieu ( $lieuDO ) );

		}
		return $listLieu;

	}


	private function convertLieuDOtoLieu(LieuDO $lieuDO){
		$lieu = new Lieu();
		$lieu->setAdresse($lieuDO->getAdresse());
		$lieu->setNumeroLieu($lieuDO->getNumeroLieu());
		return $lieu;
	}


	private function convertResponsableDOtoUtilisateur(ResponsableDO $responsableDO){
		$utilisateur = new Utilisateur();
		$utilisateur->setNom($responsableDO->getNom());
		$utilisateur->setPrenom($responsableDO->getPrenom());
		$utilisateur->setListLieu($this->getListLieu($responsableDO));
		$utilisateur->setEstResponsable(true);
		$utilisateur->setNumeroResponsable($responsableDO->getNumeroResponsable());

		return $utilisateur;
	}

	private function convertGestionnaireDOtoUtilisateur(GestionnaireDO $gestionnaireDO){
		$utilisateur = new Utilisateur();
		$utilisateur->setNom($gestionnaireDO->getNom());
		$utilisateur->setPrenom($gestionnaireDO->getPrenom());
		$utilisateur->setListLieu(null);
		$utilisateur->setEstResponsable(false);
		$utilisateur->setNumeroResponsable(null);

		return $utilisateur;
	}


}
